La boucle pour est utilisée quand on connaît le nombre de fois où l'on doit répéter une suite d'instructions.
Voici comment écrire cette boucle répétitive dans le cas où on désire $n$ répétitions, $n$ étant un nombre entier naturel non nul.
1 for i←0 to n-1 2 ÉCRIRE i
Voici une structure globale possible d'une boucle Pour en pseudo-code :
Pour i allant de 0 à n-1 faire : ... les différentes instructions à répéter ... Fin pour
Autre écriture de la boucle "pour" en pseudo-code :
for i←0 to n-1 ... les différentes instructions à répéter ...
On veut un algorithme qui donne la somme des $n$ premiers entiers naturels. C'est à dire $0+1+2+...+n-1$
Par exemple, pour $n=4$, on veut obtenir la valeur de $0+1+2+3=6$.
Voici une écriture du programme de cet exemple en pseudo-code :
1 S ← 0 2 for i←0 to 3 3 S ← S+i 4 ÉCRIRE S
Pour plus d'informations sur la boucle Pour
en pseudo-code, vous pouvez consulter ce cours du chapitre A1.
range
La première ligne fait que la suite du code va être répétée n fois en incrémentant de manière automatique la variable i de 0 à n-1.
Dans un premier temps, nous allons utiliser l'instruction range
.
Syntaxe à utiliser pour répéter un bloc d'instruction un nombre $n$ de fois connu à l'avance :
for i in range(n):
...
les différentes instructions à répéter
...
Cette faire structure va faire que les instructions situées dans le bloc vont être répétées n fois. la variable i
prendra des valeurs allant de 0 à n-1
.
À chaque nouveau passage dans la boucle i
sera incrémenter ( = augmenter) de 1.
Il n'y a pas de Fin_Pour : C'est en fait l' indentation qui sert de limitateur de boucle.
Attention ! L'indentation en python n'est pas uniquement un élément d'hygiène de programmation mais un élément faisant partie intégrante des structures.
L'initialisation et l'incrémentation du compteur est gérée automatiquement par la boucle
for
.
On utilise habituellement les lettres i, j, k, ... pour les compteurs, mais ce n'est pas une
obligation. On peut même mettre _
si nous n'avons pas besoin de compteur.
On peut imbriquer plusieurs boucles for
.
On propose le scrypt suivant :
def display(phrase: str)->None:
print(phrase)
for _ in range(5):
display("Pour comprendre et prendre plaisir dans un domaine, il faut le travailler")
Tester ce script ou/et interrogez vous sur ce qu'il produit.
Il y a trois possibilités d'utilisation de l'instruction range
, suivant le nombre de
paramètres entiers saisis :
for i in range(n):
le compteur $i$ va de 0 à $n-1$ par pas de 1 : il y a donc bien $n$ répétitions.
for i in range(m, n):
le compteur $i$ va de $m$ à $n-1$ par pas de 1 : il y a donc $n-m$ répétitions. Ici, on a forcément $n\geq m$.
for i in range(m, n, pas):
le compteur $i$ va de $m$ à $n-1$ par pas de $pas$ ; le pas est un entier relatif non nul, il peut en particulier être négatif.
for i in range(n):
équivaut à :
for i in range(0, n, 1):
for i in range(m, n):
équivaut à :
for i in range(m, n, 1):
Écrire une fonction compteur(n, m)
qui permet de visualiser les
secondes s'écouler entre n
et m
secondes.
Par exemple l'appel compteur(10, 15)
affiche :
10 secondes !
11 secondes !
12 secondes !
13 secondes !
14 secondes !
15 secondes !
Documenter cette fonction.
Ajouter une précondition qui vérifie que n
est plus petit que m
.
Dans cette exemple on donne le scrypt de la fonction somme
qui prend en argument un entier n
et qui renvoie la somme de tous les entiers de $0$ à $n$ : $0+1+2+...+n-1+n$.
somme(4)
renvoie 10 car 0+1+2+3+4=10
def somme(n: int) -> int: # les int sont ici pour indiquer le typage des variables d'entrée et de sortie. Ici le paramètre d'entrée est de type int et la sortie également.
"""La fonction somme renvoie la somme des n+1 premiers entiers naturels. C'est à dire $0+1+2+...+n-1+n$
la fonction somme a pour attribut un entier (int) : n et renvoie un autre entier :S
Pour n=4 : S=0+1+2+3+4=10"""
S = 0 # initialisation de la somme à 0
for i in range(n+1):
S = S+i
return S
# exécution de la fonction dans un cas particulier
somme(4)
Vous pouvez visualiser la trace d'exécution de cet algorithme grâce à pythontutor.
Modifier la fonction somme
de l'exemple précédent en une fonction
somme1
qui renvoie la somme des $n$ premiers entiers naturels.
Exemple : pour somme1(4)
renvoie 6 car $S=0+1+2+3=6$.
Modifier la fonction somme
de l'exemple précédent en une fonction
somme2
qui prend toujours comme paramètre un entier naturel $n$ et renvoie la somme
de tous les nombres entiers impairs inférieurs au
égaux à $n$.
Exemple : pour somme2(6)
renvoie 9 car $S=1+3+5=9$.
Voici un exercice à faire en autonomie pour tester votre maîtrise de la fonction range
.
Cet exercice est issu du site collaboratif de la forge.
Écrire une procédure table_multi
qui reçoit en entrée un nombre entier $n$ compris entre 0 et
10 et affiche en sortie la table de multiplication de ce nombre.
Par exemple, table_multi(5)
conduit à l'affichage suivant (la partie centrale n'a pas été
reproduite) :
0 fois 5 = 0
1 fois 5 = 5
2 fois 5 = 10
[...]
9 fois 5 = 45
10 fois 5 = 50
Rey affronte Kylo. Pendant cette affrontement Kylo inflige des dégâts damage
psychique
à Rey toutes les secondes pendant times
secondes.
Écrire une fonction darkSide
qui prend en paramètres pdv
,
damage
et times
. Cette fonction renvoie le nombre de points
de vie pdv
de Rey à la fin de l'attaque psychique de Kylo,
en sachant qu'à chaque seconde Rey perd une valeur égale à damage
et sachant
que l'attaque dure times
secondes.
Cette fonction doit afficher chaque seconde de l'attaque le nombre de points
de vie de Rey.
Par exemple :
darkSide(100, 2 , 1)
doit renvoyer 98 après avoir affiché avant un seul texte : "Rey a encore 98 points de vie."
.
darkSide(100, 2 , 5)
doit renvoyer 90 après avoir affiché 5 textes successifs : "Rey a encore 98 points de vie."
,
"Rey a encore 96 points de vie."
, "Rey a encore 94 points de vie."
,
"Rey a encore 92 points de vie."
et "Rey a encore 90 points de vie."
.
Dans cette question, on tient compte de l'affaiblissement de Rey. À chaque seconde les dégâts sont augmentés du nombre de seconde écoulé depuis le début de l'attaque.
Écrire la fonction darkSide2(pdv, damage, times)
qui prend en compte la fatigue psychique
de Rey.
Par exemple : darkSide2(100, 2 , 1)
doit renvoyer 97, en effet Rey perd 2 points de dégâts
et il s'est écoulé 1 seconde : il subit donc 2+1 points de dégâts.
De même, darkSide2(100, 2 , 2)
doit renvoyer 93, (2+1 points de dégâts la première seconde
et 2+2 points de dégâts la deuxième seconde).
Parfois, il est intéressant de dérouler un algorithme étape par étape
afin de savoir le contenu final d'une variable.
Une trace d'exécution (sous forme d'un tableau) peut alors être utile.
Vous placez 1000 euros sur un Plan Épargne Logement (PEL) au taux d'intérêt de 2.25% par an.
Chaque année vous déposer 600€ sur cette épargne.
Vous voulez savoir quelle somme sera en votre possession si vous clôturer ce PEL à l'issue des quatre
premières années.
On admet que dans le programme Python suivant (où des numéros de lignes ont été rajoutés)
la dernière valeur prise par la variable placement
répond à la question :
1) placement = 1000
2) for an in range(4):
3) placement = placement*(1 + 2.25/100) + 600
On complète la table d'exécution suivante en déroulant à la main chaque étape du programme ci-dessus :
Ligne | variable placement |
variable an |
---|---|---|
1 | 1000 | |
2 | 1000 | 0 |
3 | 1622.5 | 0 |
2 | 1622.5 | 1 |
3 | 2259.00625 | 1 |
2 | 2259.00625 | 2 |
3 | 2909.8338906249996 | 2 |
2 | 2909.8338906249996 | 3 |
3 | 3575.305153164062 | 3 |
Ainsi, vous posséderez $3575.31$ euros au bout des quatre années de placement.
Le but est de réaliser la trace d'exécution de l'algorithme suivant :
pdv = 30
for i in range(3):
if pdv != 30 : # "!="" signifie "différent de"
pdv = pdv + 10*i
else :
pdv = pdv - 10*i
Vous pouvez utiliser la numérotation suivante des lignes :
1) pdv = 30
2) for i in range(3):
3) if pdv != 30 : # "!="" signifie "différent de"
4) pdv = pdv + 10*i
5) else :
6) pdv = pdv - 10*i
Compléter le tableau de trace d'exécution ci-dessous en faisant dérouler chaque étape du programme :
Numéro de ligne | Contrôle sur la condition du if |
variable pdv |
variable i |
---|---|---|---|
1 | |||
2 | |||
... |
pour déterminer quelle est la valeur de la variable pdv
en fin d'exécution.
Voici un exercice à faire en autonomie pour tester votre maîtrise de la boucle for
.
Cet exercice est issu du site collaboratif de la forge.
Cet exercice est plus facile pour ceux et celles suivant la spécialité maths.
Cependant, cet exercice vous fera aussi découvrir le jeu des tours de Hanoï, jeu qui sera
utilisé l'an prochain pour comprendre la force de la notion de récursivité en programmation.
Traitez seulement le cas de la "suite définie par une formule de récurrence".
En cas de difficulté, ne pas hésiter à basculer vers la "Version à compléter" et de surtout utiliser les deux informations ci-dessous :
$u_0=1$ et pour tout entier naturel $n$ : $u_{n+1}=2\times u_n+1$.
Syntaxe à utiliser pour répéter un bloc d'instructions un nombre $n$ de fois connu à l'avance est :
for i in range(n):
les différentes instructions à répéter
L'indentation sert à délimiter une boucle for
.
Avec l'instruction for i in range(fin):
,
le compteur i
va de $0$ à $fin-1$ avec un pas de 1 : il y a $fin$ itérations.
Avec l'instruction for i in range(deb, fin):
,
le compteur i
va de $deb$ à $fin-1$ par pas de 1 : il y a $fin-deb$ itérations.
Avec l'instruction for i in range(deb, fin, pas):
,
le compteur i
va de $deb$ à $fin-1$ par pas de $pas$.
for
avec un itérableDans la partie précédente, l'instruction range(m, n)
créé un ensemble de nombres dont un éventuel
compteur parcourait ces valeurs.
Un ensemble est dit itérable si on peut le parcourir avec des structures particulières comme la boucle for
.
Au cours de cette année nous verrons progressivement différents itérables :
Une chaîne de caractères (type str
) est un itérable,
ch = "La première règle de l'écologie, c'est que les éléments sont tous liés les uns aux autres."
for lettre in ch:
print(lettre)
Une liste (type list
) est un itérable,
liste = ["hip", "hip", "hip", "Hourra!", 123, 125.2, "j'arrête"]
for elt in liste:
print(elt)
Un dictionnaire (type dict
) est un itérable, nous aborderons cette structure plus dans l'année( DC2).
En Python, pour utiliser un itérable dans une boucle for
, il suffit d'utiliser le mot-clé
in
. Voici la structure générale :
for elt in iterable:
instruction 1
instruction 2
...
Dans cette boucle, elt
va parcourir les éléments de la iterable
.
Le programme ci-dessous affiche séparément chaque caractère d'une chaîne de caractères :
# -*- coding: utf-8 -*-
ch = "may the force be with you"
for elt in ch:
print(elt)
Tester le script ci-dessus pour vérifier qu'il réalise bien ce qui a été annoncé et modifier la chaîne de caractères avec une autre phrase (Vous pouvez aussi rajouter des nombres et des symboles).
Que fait le code suivant :
# -*- coding: utf-8 -*-
citation = "Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions."
compteur = 0
for elt in citation:
if elt == "e":
compteur = compteur + 1
print(compteur)
Transformer le code pour qu'il compte le nombre de i.
Écrire une fonction est_dans_liste
qui prend en paramètres une liste
lst
et un entier n
et qui renvoie
True
si l'entier est dans la liste et False
sinon.
Tester la fonction est_dans_liste
, entre autres,
est_dans_liste([8, 4, 7, 2, 5, 4], 6)
renvoie False
et
est_dans_liste([8, 4, 7, 2, 5, 4], 4)
renvoie True
.
Proposer au moins deux autres tests pour valider cette fonction. Vous utiliserez la commande assert
.
Voici un programme qui permet de représenter le coût en temps du parcours sur un itérable comme
range
:
# importation des bibliothèques
from time import perf_counter
import matplotlib.pyplot as plt
# fonction dont le coût moyen est évalué en fonction de n
def somme(n: int) -> int:
S = 0 #
for i in range(n+1):
S = S + i
return S
# calcul du coût moyen en temps
def temps() -> list:
Ly = []
for i in range(11):
deb = perf_counter()
# 100 répétitions du calcul de la somme pour la même valeur de n
for j in range(100):
somme(10000*i)
Ly.append((perf_counter() - deb)/100) # calcul du temps moyen pour cette valeur de n
return Ly
# gestion du graphique
Lx = [10000*i for i in range(11)] # création de la liste des abscisses
Ly = temps() # Les différentes valeurs de Ly correspondront aux ordonnées des points
plt.clf()
plt.axis([0, 100000, 0, 0.015]) # fenêtre du graphique [x_min, x_max, y_min, y_max]
plt.xlabel("nombre d'entiers additionnées") # légende de l'axe des abscisses
plt.ylabel('temps moyen nécessaire (en seconde)') # légende de l'axe des ordonnées
plt.title('Coût en temps en fonction du nombre de répétitions') # titre du graphique
plt.grid() # graduation
plt.scatter(Lx, Ly, label='temps moyen') # nuage de points avec une légende explicative
plt.legend() # pour faire apparaître la légende explicative précédente
plt.show() # À ne pas oublier : pour faire apparaître le graphique
Exécuter le programme précédent (dans un jupyter-notebook).
Normalement, vous verrez apparaître un graphique proche de celui-ci :
Si vous n'avez pas 11 points sur votre graphique, remplacer dans
plt.axis([0, 100000, 0, 0.015])
0.015 par un nombre un peu plus grand (tout
dépend du processeur de votre ordinateur).
Que pouvez-vous dire quant à la relation liant le temps moyen de calcul et le nombre de répétitions ?
Quel est l'ordre de grandeur du temps moyen que prend une opération comme l'addition sur un ordinateur comme le vôtre ?
Quand le temps de calcul est proportionnel au nombre de répétitions, on dit que le coût en temps est linéaire.
Voici un exercice à faire en autonomie pour tester votre maîtrise des bases sur la boucle for
avec un itérable, ici une chaîne de caractères.
Cet exercice est issu du site collaboratif de la forge.
Cet exercice est proche de l'exercice 2 de l'épreuve pratique de Terminale et vous permettra de
découvrir la compression RLE (Run-Length Encoding).
Un itérable est un ensemble que l'on peut parcourir avec une boucle for
.
Pour utiliser un itérable dans une boucle for
, on écrit :
for elt in iterable:
les différentes instructions à répéter
La variable elt
prend alors successivement les différentes éléments constituant l'itérable.
Le temps de calcul d'une boucle for
est proportionnel au
nombre de répétitions.
La boucle répétitive conditionnelle Tant que / while est utilisée quand on ne connaît pas le nombre de fois où l'on doit répéter une suite d'instructions.
Une autre différence majeure avec la boucle pour est l'absence d'incrémentation automatique.
1 while condition vraie 2 bloc d'instructions à répéter
Comment ça marche ?
Dans la boucle while
:
la condition est évaluée une première fois ;
si la condition est Fausse, on n'entre pas dans la boucle et on continue après le bloc des
instructions du while
;
si la condition est Vraie, on entre dans la boucle :
les instructions du bloc des instructions du while
sont exécutées,
le booléen est à nouveau évalué,
et ainsi de suite, autant de fois que nécessaire pour que la condition vaille Faux.
Deux écueils à éviter :
Si la condition au départ vaut Faux, la boucle while
ne sera jamais exécutée.
Si la condition ne change jamais de valeur, la boucle while
ne s'arrêtera pas et
l'algorithme restera bloqué sur cette boucle.
On veut un algorithme qui donne la somme des $n$ premiers entiers naturels.
Par exemple, pour $n=4$, on veut obtenir la valeur de $0+1+2+3=6$.
Voici une écriture du programme de cet exemple en pseudo-code avec l'instruction répétitive
conditionnelle while
:
1 S ← 0 2 i ← 0 3 while i < n : 4 S ← S+i 5 i ← i+1 6 ÉCRIRE S
Pour plus d'informations sur la boucle while
en pseudo-code, consulter le cours suivant du chapitre A1.
Syntaxe à utiliser avec l'instruction while :
while condition:
...
les différentes instructions à répéter
...
Ici, les instructions du bloc seront répétées tant que la condition est vraie (= True
)
Le programme ci-dessous affiche le nombre de pièces d'or po
restant à un personnage
dépassant 2 pièces d'or à chaque tour :
po = 50
while po > 0:
po -= 2
print("Le personnage a encore "+str(po)+" pièces d'or.")
print("Le personnage est ruiné")
Il n'y a pas de Fin_while : C'est en fait l' indentation qui sert de limitateur de boucle.
Contrairement à la boucle for
, l'initialisation et l'incrémentation du compteur ne
sont pas gérée automatiquement par la boucle while
.
On utilise habituellement les lettres i, j, k, ... pour les compteurs, mais ce n'est pas une obligation et il est préférable d'utiliser des variables dont le nom est porteur de sens.
On peut imbriquer plusieurs boucles while
.
On peut réécrire en langage Python, sous forme d'une fonction l'algorithme vu dans l'exemple précédent (lien direct) ainsi :
def somme(n: int) -> int:
"""""La fonction somme renvoie la somme des n premiers entiers naturels.
la fonction somme a pour attribut un entier (int) : n et renvoie un autre entier :S
Pour n=4 : S=0+1+2+3=6"""""
S = 0 #initialisation de la somme à 0
i = 0
while i < n-1:
i += 1 #on aurait pu écrire aussi i = i+1 ; incrémente i de 1 à chaque passage dans la boucle
S = S + i
return S
Vous pouvez visualiser la trace d'exécution étape par étape de cet algorithme grâce à pythontutor.
Les différentes étapes de l'exécution de cet algorithme peuvent résumées dans cette trace d'exécution :
tester ce script :
#Attention ! Enregistrez votre travail avant d'exécuter ce script !
while True:
print("Encore ?")
qu'observez vous?
Modifier la fonction somme
de l'exemple précédent en une fonction
somme1
qui renvoie la somme des $n+1$ premiers entiers naturels.
Exemple : pour somme1(4)
renvoie 10 car $S=0+1+2+3+4=10$.
Modifier la fonction somme
de l'exemple précédent en une fonction
somme2
qui prend toujours comme paramètre un entier naturel non nul $n$ et renvoie
la somme de tous les nombres entiers impairs inférieurs
ou égaux à $n$.
Exemple : pour somme2(6)
renvoie 9 car $S=1+3+5=9$.
Rajouter une précondition pour assurer le bon fonctionnement de somme2
.
Proposer au moins deux tests pour valider cette fonction.
Une association militant pour la sauvegarde d'une espèce protégée fait appel à un financement participatif. Cette association a besoin de 13500€ pour mener à bien sa campagne annuelle. Elle aimerait savoir combien de jours seront nécessaires pour obtenir la somme de 13500€ en fonction de la somme moyenne recueillie sur le site. Elle fait appel à vous afin que vous lui créiez un programme répondant à la question.
Écrire une fonction attendre
qui prend comme paramètre d'entrée un flottant
montant_moyen_don
indiquant le don en moyenne recueilli quotidiennement sur le site et
renvoie un entier indiquant le nombre de jours
nécessaires pour atteindre 13500€.
Proposer des préconditions à cette fonction.
On considère la fonction suivante :
def repeter(n: int) -> int:
while n > 10:
n = n - 10
return n
Parmi les assertions suivantes lesquelles sont vraies ?
Réponses :
A- On sort de la boucle while
dès que n > 10
.
B- On sort de la boucle while
dès que n < 10
.
C- On sort de la boucle while
dès que n <= 10
.
D- On continue la boucle while
tant que n > 10
.
E- On continue la boucle while
tant que n < 10
.
F- On continue la boucle while
tant que n <= 10
.
Voici un script utilisant l'intrusion répétitive for
permettant d'afficher tous les nombres entiers entre 10 et 99 :
def deux_chiffres() -> None:
"""fonction, sans paramètre, affiche successivement tous les nombres entiers compris entre 10 et 99"""
for nb in range(10,100):
print(nb)
# exécution de la procédure :
deux_chiffres()
Compléter le script suivant utilisant l'instruction répétitive conditionnelle while
, script qui doit aussi afficher
tous les nombres entiers entre 10 et 99 :
def deux_chiffres2() -> None:
...
while ...:
print(nb)
...
# exécution de la procédure :
deux_chiffres2()
Quelles modifications vous ont permis de remplacer un for
par un while
?
Pour répéter un nombre de fois par forcément connu, on utilise une
boucle while
avec la structure :
while condition:
les différentes instructions à répéter
Les instructions sont répétées tant que la condition condition
est vraie.
L'indentation sert à délimiter une boucle while
.
On reprend l'exercice qui permettait de savoir si un nombre entier n
fait partie d'une liste
lst
ou non. ( lien vers l'exercice similaire traité avec la boucle
for
.)
Dans la version avec deux return
pour forcer l'arrêt dès que la valeur n
est trouvée, on avait trouvé :
def est_dans_liste(lst: list, n: int) -> bool:
for elt in lst:
if elt == n :
return True # Arrêt de la fonction dès qu'un élément de la liste vaut n
return False # Ligne atteinte dans le cas où aucun élément de la liste ne vaut n
Plutôt que de balayer la liste lst
par les valeurs avec la ligne for elt in lst:
,
il est possible de balayer le liste par les positions avec la structure for pos in range(len(lst)):
.
len(lst)
renvoie le nombre d'éléments de la liste lst
. Par exemple,
si lst = [1, 4, 1, 5, 8, 7]
, len(lst)
vaut 6.
En balayant par les positions, on peut accéder à l'élément de la liste en position pos
grâce à l'expression lst[pos]
, en sachant que la position commence par l'indice 0.
Par exemple, si lst = [1, 4, 1, 5, 8, 7]
,
lst[3]
vaut 5, le quatrième élément puisque le premier est lst[0]
.
Ainsi, il est possible de réécrire la fonction est_dans_liste
précédente en celle
est_dans_liste2
ci-dessous :
def est_dans_liste2(lst: list, n: int) -> bool:
for pos in range(len(lst)): # balayage de la liste par les positions
if lst[pos] == n : # étude de l'élément en position (=d'indice) pos
return True # Arrêt de la fonction dès qu'un élément de la liste vaut n
return False # Ligne atteinte dans le cas où aucun élément de la liste ne vaut n
En inspirant de la fonction def est_dans_liste2
, créer une fonction
def est_dans_liste3
dans laquelle la boucle for
est remplacée par une boucle
while
.
Exemples de tests :
est_dans_liste3([8, 4, 7, 2, 5, 4], 6)
renvoie False
.
est_dans_liste3([8, 4, 7, 2, 5, 4], 7)
renvoie True
.
Vous allez programmer un jeu de nombre à deviner contre un ordinateur. Pour commencer l'ordinateur va choisir au hasard un nombre compris entre 1 et 100.
Ensuite, l'utilisateur doit alors deviner ce nombre comme ceci :
l'utilisateur propose un nombre,
l'ordinateur affiche s'il est trop petit ou trop grand,
et ainsi de suite jusqu'à ce que l'utilisateur ait trouvé le bon nombre.
Rappeler les lignes de codes à écrire en Python afin d'obtenir un nombre entier entre 1 et 100.
Écrire une procédure plus_ou_moins
, sans paramètre d'entrée ni retour qui
correspond au jeu du nombre à deviner.
Voici un exemple de traces d'affichages successifs obtenus sur un jupyter-notebook dans le cas où l'ordinateur avez choisi au hasard le nombre 41 :
Donnez un entier entre 1 et 100. 50
La réponse est inférieure à votre proposition. Essayez encore !25
La réponse est supérieure à votre proposition. Essayez encore !32
La réponse est supérieure à votre proposition. Essayez encore !41
Bravo ! Vous avez gagné !
On veut complexifier le jeu en imposant un nombre d'essais maximal.
Modifier la fonction précédente en une nouvelle plus_ou_moins2
qui :
prend un nombre entier comme paramètre, nombre entier qui correspond au nombre maximum d'essais autorisés,
permet de jouer comme précédent sans permettre plus d'essais que le nombre maximum entré,
affiche soit la défaite soit la victoire en précisant le nombre d'essais nécessaires.
Proposer des préconditions à cette fonction plus_ou_moins2
.
Votre personnage préféré dispose de 25 pièces d'or. À chaque mission qu'il mène à son terme, il ressort avec un nombre aléatoire entre 0 et 20 pièces d'or supplémentaires.
Écrire une fonction nb_mission(target)
qui prend en argument un entier target
et
qui renvoie le nombre de missions à effectuer pour obtenir un nombre de pièces d'or au moins égal à target
.
Lorsque l'utilisateur saisit un code secret, il faut vérifier que le code est correct. Dans cette exercice, le code secret sera "password"
Proposer un programme qui demande à l'utilisateur de rentrer un code secret.
Compléter ce programme afin de demander à l'utilisateur de saisir un nouveau code si le code entré ne correspond pas au bon code.
Modifier le programme précédent pour limiter la répétition à au plus 3 demandes successives.
Rajouter un message d'arrêt si l'utilisateur "s'obstine" à saisir un code invalide.
Voici un exercice à faire en autonomie pour tester votre maîtrise des bases sur la boucle while
.
Cet exercice est issu du site collaboratif de la forge.
Cet exercice où un seuil est recherché est plus simple pour ceux et celles suivant la spécialité maths.
Ne pas hésiter à basculer vers la "Version à compléter" en cas de difficultés.
Cliquer sur ce lien pour accéder à l'exercice.
Pour ceux et celles préférant retravailler sur le jeu "plus ou moins", voici une version à compléter du type du deuxième exercice de l'épreuve pratique :
Votre enseignant vous exploite : il vous demande de créer un programme qui lui renverra la moyenne des notes saisies.
Pour cela, il vous donne le cahier des charges suivant :
Créer une fonction continuer
, sans paramètre d'entrée qui demande à l'utilisateur
s'il veut poursuivre ou non la saisie de notes et qui renvoie un booléen True
en cas
de poursuite et False
sinon.
Créer une fonction moyenne
qui calcule la nouvelle moyenne liée à l'ajout d'une
note.
Créer dans le programme principal une fonction main
qui conduit à demander une
nouvelle note et à calculer la moyenne obtenue alors jusqu'à ce que l'utilisateur décide
d'arrêter la saisie.
Proposer une fonction continuer
qui répond au cahier des charges. Faire en sorte que
la casse (=minuscule ou majuscule) ne soit pas un problème pour la saisie, par exemple en
utilisant ma méthode upper
.
"mélanGes".upper()
renvoie 'MÉLANGES'
.
Tester la fonction continuer
créée.
Proposer une fonction moyenne
qui répond au cahier des charges. Cette fonction aura
trois paramètres :
moy
un flottant qui correspond à la moyenne pour l'instant obtenue,
nb_notes
un entier qui correspond au nombre de notes déjà pris en compte dans
la moyenne moy
,
new_note
un flottant qui correspond à la nouvelle note à prendre en compte pour
la moyenne.
Cette fonction renverra la moyenne de l'ensemble des notes saisies (en comptant aussi la dernière).
On considère deux ensembles de notes A et B de moyenne respective $moy_A$ et $moy_B$ comprenant respectivement $nb_A$ et $nb_B$ notes. La moyenne des notes formant la réunion de ces deux ensembles est donnée par la formule :
$$ moyenne = \frac{moy_A \times nb_A + moy_B \times nb_B}{nb_A + nb_B}$$.Tester la fonction moyenne
créée.
Proposer une fonction main
qui répond au cahier des charges. Cette fonction fera
appel aux deux fonctions
continuer
et moyenne
et n'aura pas de paramètre ; elle renverra la
moyenne de toutes les notes successivement saisies.
Tester votre programme principal, par exemple en saisissant successivement les valeurs 10, 19 et 13.
Réaliser une trace d'exécution pour l'algorithme qui suit avec n=20
; les numéros de lignes
ne servent qu'à faciliter le repérage des lignes.
1) r = 0
2) while r*r <= n:
3) r = r + 1
4) r = r - 1
Pour une valeur de n
donnée, à quoi correspond
le contenu de la variable r
à la fin de l'exécution de l'algorithme ?
Vous avez décider de partir en randonnée avec un ami. Celui possède un très grand sac pesant 5.2kg et a une technique très particulière pour le remplir : il prend au hasard des éléments parmi tout le nécessaire à emporter et s'arrête dès que le poids obtenu dépasse 20 kg. Les objets choisis au hasard pèsent tous entre 10 et 500 grammes.
Comme vous êtes très intrigué.e par sa manière de faire, vous décider de modéliser la situation informatiquement afin d'évaluer en moyenne combien d'éléments va prendre votre ami dans son sac.
Pour cela, vous disposez des informations suivantes :
Pour modéliser informatiquement l'ensemble de masses des objets pris, il est préférable d'utiliser une liste,
pour créer une liste vide qui s'appelle lst
, on écrit en Python :
lst = []
pour rajouter un élément à cette liste lst
, par exemple 25, on écrit en Python :
lst.append(25)]
pour obtenir un nombre entier aléatoire entre deux nombres $a$ et $b$, il suffit d'importer la
fonction
randint
du module random
et d'écrire :
randint(a,b)
Proposer une fonction remplir_sac
, sans paramètre, qui renvoie la liste des masses
des objets du sac de sorte que le remplissage s'arrête dès que la masse totale dépasse 20 kg.
Proposer une fonction nb_objets
qui prend en paramètres une liste et renvoie le
nombre d'éléments de cette liste.
Proposer une fonction qui renvoie une moyenne du nombre d'éléments que va prendre cet ami dans son sac.
Écrire une fonction triangle
qui prend en paramètre un nombre entier n
et
qui affiche un triangle isocèle formé d’étoiles.
La hauteur du triangle (c’est-à-dire le nombre de lignes) correspond à l'argument n
, comme
dans l’exemple ci-dessous.
On s’arrangera pour que la dernière ligne du triangle s’affiche sur le bord gauche de l’écran.
Exemple d'exécution de triangle(6) :
*
***
*****
*******
*********
***********
Écrire un code qui affiche toutes les manières possibles d’obtenir un euro avec des pièces de 2 cents, 5 cents et 10 cents. Faire aussi afficher combien de possibilités ont été ainsi trouvées.
Les résultats seront affichés comme suit :
1 euro = 50 X 2c
1 euro = 45 X 2c 2 X 5c
1 euro = 40 X 2c 4 X 5c
1 euro = 35 X 2c 6 X 5c
1 euro = 30 X 2c 8 X 5c
1 euro = 25 X 2c 10 X 5c
1 euro = 20 X 2c 12 X 5c
1 euro = 15 X 2c 14 X 5c
1 euro = 10 X 2c 16 X 5c
1 euro = 5 X 2c 18 X 5c
1 euro = 20 X 5c
1 euro = 45 X 2c 1 X 10c
1 euro = 40 X 2c 2 X 5c 1 X 10c
1 euro = 35 X 2c 4 X 5c 1 X 10c
1 euro = 10 X 2c 2 X 5c 7 X 10c
1 euro = 5 X 2c 4 X 5c 7 X 10c
1 euro = 6 X 5c 7 X 10c
1 euro = 10 X 2c 8 X 10c
1 euro = 5 X 2c 2 X 5c 8 X 10c
1 euro = 4 X 5c 8 X 10c
1 euro = 5 X 2c 9 X 10c
1 euro = 2 X 5c 9 X 10c
1 euro = 10 X 10c
En tout, il y a 66 façons de faire 1 euro
Écrire un algorithme qui affiche la « table de multiplication » des nombres de 1 à 10, sous la forme suivante :
| 01 02 03 04 05 06 07 08 09 10
--------------------------------------------
01 | 01 02 03 04 05 06 07 08 09 10
02 | 02 04 06 08 10 12 14 16 18 20
03 | 03 06 09 12 15 18 21 24 27 30
04 | 04 08 12 16 20 24 28 32 36 40
05 | 05 10 15 20 25 30 35 40 45 50
06 | 06 12 18 24 30 36 42 48 54 60
07 | 07 14 21 28 35 42 49 56 63 70
08 | 08 16 24 32 40 48 56 64 72 80
09 | 09 18 27 36 45 54 63 72 81 90
10 | 10 20 30 40 50 60 70 80 90 100
Pour gérer l'affichage des nombres et faire en sorte que les premiers s'écrivent avec deux chiffres,
vous pouvez utiliser le symbole %
:
le signe % suivi d’une lettre indiquant le type de la variable :
%s
: chaîne de caractères ;
%d
: nombre entier ;
%.Xd
: X désignant un nombre entier indiquant le nombre de chiffres minimal
pour écrire le nombre entier ;
%f
: nombre décimal ;
%.Xf
: X désignant un nombre entier indiquant le nombre de décimales après
la virgule.
Le signe % derrière l'apostrophe de fermeture introduit la valeur de chaque variable (dans l’ordre d’apparition respectif dans le texte, un peu comme la méthode format() )
print('%d'%1234)
renvoie 1234 ;
print('%.2d'%1234)
renvoie 1234 ;
print('%.6d'%1234)
renvoie 001234 ;
print("valeur1=%.6d , valeur2=%.3f" %(1234,1.23456))
renvoie
valeur1=001234 , valeur2=1.235.
Voici un exercice à faire en autonomie pour tester votre maîtrise sur les boucles imbriquées.
Cet exercice est plus compliqués que ceux des autotests précédents.
Cet exercice est issu du site collaboratif de la forge.
Dans cet exercice, vous jouerez au hacker ayant à casser (par force brute) un digicode.
Vu la difficulté de l'exercice, ne pas hésiter à basculer vers la "Version à compléter" en cas de difficultés.
Vous pouvez vous rendre sur le site France IOI. Créer un compte et rejoindre le groupe NSI de votre lycée.
Il faut attendre qu'un professeur valide votre compte.
Nous pouvons visualiser votre progression. Ce travail sera valorisé.
Il est idéal si vous avez des difficultés avec l'algorithmique mais idéal aussi pour vous perfectionner.
for
avec range
Écrire une fonction produit
qui prend comme paramètre un entier naturel $n$ et renvoie le
produit de tous les nombres entiers compris entre 1 et $n$.
Exemple : pour produit(4)
renvoie 24 car $P=1\times 2\times 3\times 4=24$.
Pour accéder au code de la correction : lien
Vous travaillez pour un magasin de bricolage.
Vous avez à gérer un programme informatique qui créé l'affichage du prix à payer suivant le nombre de vis particulières.
Chaque vis coûte 0.15€.
Écrire une procédure prix_vis
qui reçoit en entrée un nombre entier $n$ et affiche en sortie
un ensemble de lignes ; chaque ligne affiche le prix à payer pour un nombre de vis.
Par exemple, prix_vis(10)
conduit à l'affichage suivant (la partie centrale n'a pas été
reproduite) :
Remarquez que le calcul avec des flottants est imprécis. On pourrait utiliser la fonction
round
par exemple pour arrondir au centime d'euro.
Pour accéder au code de la correction : lien
Vous travaillez pour une ONG qui creuse des puits en zone sahélienne.
Il y a un coût fixe de 800€ pour l'étude de chantier et l'apport du matériel sur la zone.
Le premier mètre coûte 50€ pour être creusé.
Chaque mètre supplémentaire creusé coûte 5€ de plus que le précédent.
Par exemple, le deuxième mètre creusé coûte 55€, le troisième 60€, ...
Ainsi, le coût total pour
creuser un puits de trois mètres de profondeur est de 800+50+55+60=965 €.
Écrire une fonction cout_puits
qui en entrée reçoit un entier $n$ non nul qui correspond à
la profondeur en mètres du puits à percer et en sortie renvoie le coût total de percement en euros.
Une fois la fonction écrite, rajouter une ou des préconditions afin que $n$ soit bien un entier non nul.
Pour accéder au code de la correction : lien
for
avec un itérable
Écrire une fonction occurrence_dans_liste
qui prend en paramètre une liste
lst
et un entier $n$ et qui renvoie le nombre de fois où l'entier $n$ apparaît dans
la liste.
Tester la fonction occurrence_dans_liste
, entre autres,
occurrence_dans_liste([8,4,7,2,5,4],6)
renvoie 0
et
occurrence_dans_liste([8,4,7,2,5,4],4)
renvoie 2
.
Proposer au moins trois tests pour valider cette fonction.
Pour accéder au code de la correction : lien
while
Écrire une fonction produit2
, utilisant une boucle while qui prend comme paramètre
un entier naturel $n$ et renvoie le produit de tous les nombres entiers compris entre 1 et $n$.
Exemple : pour produit2(4)
renvoie 24 car $P=1\times 2\times 3\times 4=24$.
Proposer au moins deux tests pour valider cette fonction.
Rajouter une précondition sur $n$ pour s'assurer que $n$ est bien un entier naturel non nul.
Pour accéder au code de la correction : lien
Karamoko place 1200€ sur un compte rémunéré à 1.3%, c'est-à-dire que chaque fin d'année la banque rajoute au capital placé par Karamoko 1.3% d'intérêt par rapport à la somme présente sur le compte en début d'année.
Écrire une fonction attendre
qui prend comme paramètre d'entrée un flottant
objectif
indiquant la somme qu'aimerait atteindre Karamoko sur son compte et
renvoie un entier indiquant le nombre d'années
nécessaire pour atteindre cette somme.
Proposer une précondition à cette fonction.
Comme l'espérance de vie d'une personne plaçant de l'argent en banque est inférieure à 100 ans, rajouter une postcondition à cette fonction.
Pour accéder au code de la correction : lien
Pour obtenir la somme des nombres entiers non nuls inférieurs à un entier n
et ayant pour chiffre des unités 3,
le script suivant est proposé :
def que_les_3(n:int) -> int:
"""fonction qui prend en paramètre un entier n
et qui renvoie la somme de tous les nombres entires positifs inférieurs à n ayant 3 comme chiffre des unités"""
S = 0
for nb in range(3,n,10):
S = S + nb
return S
Modifier le script précédent afin d'obtenir une fonction réalisant la même tâche mais utilisant un while
au lieu d'un for
Il suffit avant la boucle while
d'initialiser nb
à la première valeur possible, c'est-à-dire 3.
Ensuite, de limiter nb
à n
à l'aide de la condition écrite pour le while
.
Enfin, de faire évoluer à chaque itération la variable nb
.
D'où le code :
def que_les_3(n:int) -> int:
"""fonction qui prend en paramètre un entier n
et qui renvoie la somme de tous les nombres entires positifs inférieurs à n ayant 3 comme chiffre des unités"""
S = 0
nb = 3
while nb<n :
S = S + nb
nb = nb + 10
return S
Chaque année la consommation énergétique d'un data center est estimée augmenter de 8 %.
Déterminer le nombre d'années nécessaires au doublement de la consommation énergétique de ce data
center.
Le résultat ne dépend pas de la consommation énergétique actuelle de ce data center.
Pour accéder au code de la correction : lien
Voici un algorithme où la variable mot
n'est pas encore définie :
i = 0
j = len(mot)-1 # position du dernier élément de la liste mot
p = True
while i <= j:
if mot[i] == mot[j]:
i = i+1
j = j-1
else:
p = False
i = 1
j = 0
print(p)
Compléter la trace d'exécution avec mot = ['r', 'a', 'd', 'a', 'r']
.
Instructions (=lignes) | Contrôle des conditions | Variables | ||||
---|---|---|---|---|---|---|
i | j | n | p | mot | ||
Avant | ? | ? | 5 | ? | ['r', 'a', 'd', 'a', 'r'] | |
1 | 0 |
Compléter la trace d'exécution avec mot = ['n', 's', 'i']
.
Instructions (=lignes) | Contrôle des conditions | Variables | ||||
---|---|---|---|---|---|---|
i | j | n | p | mot | ||
Avant | ? | ? | 3 | ? | ['n', 's', 'i'] | |
1 | 0 |
Quel est le rôle de l'algorithme ?
Voici la trace d'exécution avec mot = ['r', 'a', 'd', 'a', 'r']
:
Instructions (=lignes) | Contrôle des conditions | Variables | ||||
---|---|---|---|---|---|---|
i | j | n | p | mot | ||
Avant | ? | ? | 5 | ? | ['r', 'a', 'd', 'a', 'r'] | |
1 | 0 | |||||
2 | 4 | |||||
3 | True | |||||
4 | i <= j Vrai | |||||
5 | mot[i] = mot[j] Vrai | |||||
6 | 1 | |||||
7 | 3 | |||||
4 | i <= j Vrai | |||||
5 | mot[i] = mot[j] Vrai | |||||
6 | 2 | |||||
7 | 2 | |||||
4 | i <= j Vrai | |||||
5 | mot[i] = mot[j] Vrai | |||||
6 | 3 | 1 | ||||
4 | i <= j Faux | |||||
12 | Afficher True |
Voici la trace d'exécution avec mot = ['n', 's', 'i']
:
Instructions (=lignes) | Contrôle des conditions | Variables | ||||
---|---|---|---|---|---|---|
i | j | n | p | mot | ||
Avant | ? | ? | 3 | ? | ['n', 's', 'i'] | |
1 | 0 | |||||
2 | 2 | |||||
3 | True | |||||
4 | i <= j Vrai | |||||
5 | mot[i] = mot[j] Faux | |||||
8 | ||||||
9 | False | |||||
10 | 1 | |||||
11 | 0 | |||||
4 | i <= j Faux | |||||
12 | Afficher False |
Le rôle de l'algorithme est de renvoyer True
si le mot
formé par les lettres contenus dans la liste est un palindrome et
False
sinon.
Voici une vidéo qui corrige cet exercice :
Dès que vous avez terminé ce parcours "de base" vous devez vous lancer dans des mini-projets.
Vous devez vous mettre par groupe de deux ou trois
Ce projet sera présenté à vos professeurs selon une organisation que l'on fixera.
La forme de ce projet est laissé libre, il faut rendre un support qui décrit votre projet et qui contient des codes pythons.
Chacun doit être capable de décrire sa participation dans le groupe.
Le choix du projet est libre, ne soyez pas trop ambitieux, vous débutez.
Vous pouvez partir sur des projets existants
Il faudra être capable d'expliquer les codes pythons et de montrer les modifications que vous avez apporté.
Pensez bien à documenter et à tester vos fonctions et programmes en laissant apparentes les préconditions et les postconditions utilisées.
Quelques idées :
Faire de la cryptographie. coder et décoder un message (Code César, Vigenère, ...).
En lien avec les maths : implanter le cours sur le discriminant : recherche de racines ; affichage ; nombre de solutions; représentation graphique.
En lien avec le français : faire de l'analyse de phrase : trouver la fréquence de chaque lettre dans une phrase et/ou un paragraphe, éventuellement prolonger vers la méthode d'Al Kindi pour déchiffrer certains codes secrets.
En lien avec la SVT : travailler sur des séquences ADN ou ARN : transcription, traduction, réplication, ...
À inventer ...
Pour un projet, il faudra être capable de faire une explication rapide de votre idée et d'organiser une démo (fonction utilisateur) à vos professeurs.
Propriétaire des ressources ci-dessous : ministère de l'Éducation nationale et de la jeunesse, licence CC BY SA NC
Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive).
Quelle est la valeur du couple $(s, i)$ à la fin de l'exécution du script suivant ?
s = 0
i = 1
while i < 5:
s = s + i
i = i + 1
Réponses :
A- (4, 5)
B- (10, 4)
C- (10, 5)
D- (15, 5)
$𝑛$ étant un entier strictement positif, la fonction suivante calcule sa factorielle, c'est-à-dire le produit $1 \times 2 \times 3 \times ⋯ \times (𝑛 − 1) \times 𝑛$. Comment faut-il écrire la ligne en pointillée ci-dessous pour ce faire ?
def factorielle(n):
f = 1
.........
f = f * i
return f
Réponses :
A- for i in range(1, n):
B- for i in range(n+1):
C- for i in range(0, n):
D- for i in range(1, n+1):
On exécute le script suivant :
a = 4
b = 4
c = 4
while a < 5:
a = a - 1
b = b + 1
c = c * b
Que peut-on dire ?
Réponses :
A- ce programme ne termine pas
B- à la fin de l'exécution, la variable a vaut 5
C- à la fin de l'exécution, la variable b vaut 34
D- à la fin de l'exécution, la variable c vaut 42
On souhaite écrire une fonction qui renvoie le maximum d'une liste d'entiers :
def maximum(L):
m = L[0]
for i in range(1, len(L)):
if .........:
m = L[i]
return m
Par quoi faut-il remplacer les pointillés pour que cette fonction produise bien le résultat attendu ?
Réponses :
A- i > m
B- L[i] > m
C- L[i] > L[i-1]
D- L[i] > L[i+1]
Quelle est la valeur de c à la fin de l'exécution du code suivant :
L = [1, 2, 3, 4, 1, 2, 3, 4, 0, 2]
c = 0
for k in L:
if k == L[1]:
c = c+1
Réponses :
A- 0
B- 2
C- 3
D- 10
Que renvoie la fonction suivante quand on l'appelle avec un nombre entier et une liste d'entiers ?
def mystere(n, L):
for x in L:
if n == x:
return True
return False
Réponses :
A- une valeur booléenne indiquant si le nombre n est présent au moins une fois dans la liste L
B- une valeur booléenne indiquant si le nombre n est présent plusieurs fois dans la liste L
C- une valeur booléenne indiquant si le nombre n est le plus grand de la liste L
D- une valeur booléenne indiquant si le nombre n est le plus petit de la liste L
La fonction mystere
suivante prend en argument un tableau d'entiers.
def mystere(t):
for i in range(len(t) - 1):
if t[i] + 1 != t[i+1]:
return False
return True
À quelle condition la valeur renvoyée par la fonction est-elle True ?
Réponses :
A- si le tableau passé en argument est une suite d'entiers consécutifs
B- si le tableau passé en argument est trié en ordre croissant
C- si le tableau passé en argument est trié en ordre décroissant
D- si le tableau passé en argument contient des entiers tous identiques
T
est un tableau de nombres entiers non vide. Que représente la valeur de s
renvoyée par cette fonction ?
def mystere(T):
s = 0
for k in T:
if k%2 == 0:
s = s+k
return s
Réponses :
A- la somme des valeurs du tableau T
B- la somme des valeurs positives du tableau T
C- la somme des valeurs impaires du tableau T
D- la somme des valeurs paires du tableau T
On considère le code incomplet suivant qui recherche le maximum dans une liste.
liste = [5, 12, 15, 3, 15, 17, 29, 1]
iMax = 0
for i in range(1, len(liste)):
............
iMax = i
print(liste[iMax])
Par quoi faut-il remplacer la ligne pointillée ?
Réponses :
A- if i > iMax:
B- if liste[i] > liste[iMax]:
C- if liste[i] > iMax:
D- if i > liste[iMax]:
Quelle est la valeur de element à la fin de l'exécution du code suivant :
L = [1, 2, 3, 4, 1, 2, 3, 4, 0, 2]
element = L[0]
for k in L:
if k > element:
element = k
Réponses :
A- 0
B- 1
C- 4
D- 10
La fonction suivante doit calculer la moyenne d’un tableau de nombres, passé en paramètre. Avec quelles expressions faut-il remplacer les points de suspension pour que la fonction soit correcte ?
def moyenne(tableau):
total = ...
for valeur in tableau:
total = total + valeur
return total / ...
Réponses :
A- 1 et (len(tableau) + 1)
B- 1 et len(tableau)
C- 0 et (len(tableau) + 1)
D- 0 et len(tableau)
Quelle est la valeur de la variable n
à la fin de
l'exécution du script ci-dessous ?
n = 1
while n != 20:
n = n + 2
Réponses :
A- 1
B- 20
C- 22
D- le programme ne termine pas, la boucle tourne indéfiniment
Soit $n$ un entier naturel. Sa factorielle est le produit des nombres entiers strictement positifs qui
sont plus petits ou égaux à $n$.
Par exemple la factorielle de 4 vaut $1\times 2\times 3\times 4 =24$.
Quelle est la fonction correcte parmi les suivantes ?
Réponses :
A-
def factorielle(n):
i = 0
fact = 1
while i <= n:
fact = fact * i
i = i + 1
return fact
B-
def factorielle(n):
i = 1
fact = 1
while i < n:
fact = fact * i
i = i + 1
return fact
C-
def factorielle(n):
i = 0
fact = 1
while i < n:
i = i + 1
fact = fact * i
return fact
D-
def factorielle(n):
i = 0
fact = 1
while i <= n:
i = i + 1
fact = fact * i
return fact
On exécute le script suivant :
for i in range(n):
for j in range(i):
print('NSI')
Combien de fois le mot NSI est-il affiché ?
Réponses :
A- $n^2$
B- $(n+1)^2$
C- $1+2+...+(n-1)$
D- $1+2+...+(n-1)+n$
La fonction suivante doit calculer le produit de tous les éléments de la liste passée en paramètre. Avec quelles expressions doit-on la compléter pour que cette fonction soit correcte ?
def produit (L):
p = ...
for elt in L:
.......
return p
Réponses :
A- 1 puis p = p * elt
B- 0 puis p = p * elt
C- 1 puis p = elt
D- 0 puis p = elt
On considère un entier positif $A$.
Parmi les quatre codes suivants, il y en a un dont l'exécution
ne termine pas. Lequel ?
Réponses :
A-
i = A + 1
while i < A:
i = i - 1
B-
i = A + 1
while i < A:
i = i + 1
C-
i = A - 1
while i < A:
i = i - 1
D-
i = A - 1
while i < A:
i = i + 1
Que peut-on dire du programme Python suivant de calcul sur les nombres flottants ?
x = 1.0
while x != 0.0:
x = x - 0.1
Réponses :
A- l'exécution peut ne pas s'arrêter, si la variable x n'est jamais exactement égale à 0.0
B- à la fin de l'exécution, x vaut -0.00001
C- à la fin de l'exécution, x vaut 0.00001
D- l'exécution s'arrête sur une erreur FloatingPointError
Soit T un tableau de flottants, a et b deux entiers. On considère une fonction nommée somme renvoyant la somme des éléments du tableau d'indice compris entre a et b définie par :
def somme(T, a, b):
S = 0
for i in range(a, b+1) :
S = S + T[i]
return S
Quel ensemble de préconditions doit-on prévoir pour cette fonction ?
Réponses :
A- a < b
B- a < longueur(T) et b < longueur(T)
C- a <= b < longueur(T)
D- a <= b < longueur(T) et T est un tableau trié
Les QCM suivants sont issus de https://genumsi.inria.fr.
On souhaite que l’utilisateur saisisse une valeur entière comprise entre 1 et 20 (inclus).
Quel
code est correct ?
Réponses :
A-
a = int(input("Saisir un nombre entre 1 et 20") )
while (a < 1 and a > 20) :
a = int(input("Saisir un nombre entre 1 et 20") )
B-
while (a >= 1 and a =< 20) :
a = int(input("Saisir un nombre entre 1 et 20") )
C-
a = int(input("Saisir un nombre entre 1 et 20") )
while (a < 1 or a > 20) :
a = int(input("Saisir un nombre entre 1 et 20") )
D-
a = int(input("Saisir un nombre entre 1 et 20") )
while (a >=1 and a >= 20) :
a = int(input("Saisir un nombre entre 1 et 20") )
On souhaite écrire un programme affichant tous les entiers multiples de 3 entre 6 et 288 inclus.
Quel code est correct ?
Réponses :
A-
for n in range(6, 288, 3) :
print(n)
B-
for n in range(6, 289) :
print(n/3)
C-
for n in range(6, 288) :
print(3 * n)
D-
for n in range(6, 290, 3) :
print(n)
$a$ et $m$ étant des entiers strictement positifs, la fonction suivante calcule $a^m$ :
def puissance (a, m):
p = 1
n = 0
while n < m :
p = p * a
#
n = n + 1
return p
À la ligne marquée d'un #, on a, après le # :
Réponses :
A- $p = a^n$
B- $p = a^{n+1}$
C- $p = a^{n-1}$
D- $p = a^{m}$
On utilise la fonction print
pour tracer le motif suivant :
******
* *
* *
* *
* *
******
Quel code permet d'obtenir ce motif ?
Réponses :
A :
print("******")
for loop in range(4):
print("* *")
print("******")
B :
for loop in range(6):
print("******")
print("* *")
print("******")
C :
print("******")
for loop in range(4):
print("* *")
print("******")
D :
for loop in range(4):
print("******")
print("* *")
print("******")
Il faut actualiser la page pour changer de question. Propriétaire de la ressource : le site GeNumsi en licence CC BY_NC-SA
range
avec différents paramètres.for
.for
est proportionnel au nombre de répétitions.while
.for
.for
avec un itérable.while
.
En cas de difficultés persistantes sur certaines notions de ce chapitre,
vous pouvez essayer de retravailler ces notions sur le site
futurecoder de la forge.
Les pages liées aux "Boucles `for`" sont celles le plus en lien avec le chapitre.
Les différents
auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative
Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0
International